※ この記事の内容について。 実際にリリースまで持って行けていないため実際のストアでは未検証です。
開発環境
- Unity 2022.2.7f1
- Oculus Quest2
現状開発中のOculus用アプリの容量が約10GBほどになると判明。 内容は動画ファイルがほとんどなため最適化による削減は難しいです。
APK自体を10GBにすることは出来ませんが、Oculusでは約10GB近いアプリも存在しています。 (バイオ4 VR をストアで見たとき約8.8GBと記載がありました)
手段はあると思いこのあたりを調べてみました。
※ 今回の実装にあたり以下のForumが参考になりました https://forum.unity.com/threads/combining-addressable-with-oculus-expansion-files.734858/
Oculusガイドライン
Questバーチャルリアリティチェック(VRC)ガイドライン に以下の項目がありました
VRC.Quest.Packaging.5 https://developer.oculus.com/resources/vrc-quest-packaging-5/
APKファイルは1GB未満である必要がありますが、それぞれ最大4GBの複数の拡張ファイルを付属させることができます。
ここから
- APKは最大1GB
- 最大4GBの複数の拡張ファイルを付属させることが出来る
- APKファイルは1GB未満であり、各OBBファイルは4GB未満である。
がわかります。 つまり1GBを超えるAPKは作れないため、もしそれを超える場合はアセットは別ファイルとする必要があります
OBBファイル(Opaque Binary Blob)は、APKの制限を超えて追加できる拡張ファイルのこと。 昔APKをGooglePlayStoreに申請するとき APK + OBB をまとめて提出していた ( 現在はGooglePlayStoreでは APK + OBB の形式は申請できません )
次に Oculus 公式のDocumentを見てみます
ダウンロードサイズを管理するためのアセットファイル https://developer.oculus.com/documentation/unity/ps-assets/
以下の記載があります
OBB拡張ファイル - モバイルアプリには、サイズが最大4 GBのopaque binary blob (OBB)形式の拡張ファイルを1つ含めることができます。このファイルはインストール時に自動的にダウンロードされます。
必要なアセットファイル - モバイルアプリは、OBB形式を含むほぼすべての形式の複数の一般アセットファイルを提供できます。必須アセットとしてマークすると、これらのアセットはインストール時にダウンロードされます。
そしてOBBについても触れています
- OBB拡張ファイルのサイズは最大4 GBです。このファイルは、アプリのインストール時に自動的にダウンロードおよびインストールされます。
- ファイルにはアップロード時に任意の名前を付けることができ、
main.[package-name].[version-code].obb
という形式で名前が変更されます。アセットファイルシステムは、ファイル名を使用して、ユーザーのヘッドセットでOBB拡張ファイルを更新するかどうかを決定します。
- ファイルは、ユーザーのデバイスの
/sdcard/Android/obb/[package-name]
フォルダーにインストールされます。インストール場所でファイルにアクセスできます。
OBB形式を利用する場合
- サイズ
- ファイル名
- ファイル格納箇所
に注意する必要があります
コレまでから、アプリ容量が 5GB未満 (APK 1GB, OBB 4GB ) であればこの形式に則れば申請できそうです。
Unityでは
Project Settings > Player > Android
から Split Application Binary
にチェックを入れることで自動的に APK + OBB に分割してくれます。
しかし総量が 5GB 以上を超える場合Unityは** 1GB未満のAPK と 4GBを超えたOBBを生成します** つまりコレではOculusのガイドラインに則っていないため申請ができません。
(ちなみにUnrealEngineでは一つのOBBを 4GB 未満に抑え、更に複数のOBBファイルに分割するビルドが可能です。 Unityでは複数OBBへの分割は未対応。 https://forum.unity.com/threads/how-do-i-multiple-obb.1156817/)
もし5GBを超える場合アセットバンドルを利用する必要があります。
ビルドしたアセットバンドルをサーバーに乗せる通常の方法ももちろんありですが 今回はサーバー費用も抑えたかったため Oculus内にアセットバンドルを格納して参照する方法を探しました。
Addressable Asset Systemについて
Addressable Asset System に付いては以下の記事等を参考にしてください。 (とても参考になりました..!!!!)
Addressable Assets Systemをちゃんと導入するための技術検証まとめ https://blog.applibot.co.jp/2020/06/15/introduce-addressable-assets-system/ └ Addressableについて詳しく説明
サーバーに置く場合
- Google Cloud Storage
- Amazon S3
などの選択肢がありますが
- DigitalOcean
のクラウドストレージは費用が安く個人開発にはおすすめできます。
【その他】 もしサーバーにアセットバンドルをおいて管理する場合は以下のようなエラーハンドリングを忘れないように。
【Unity】【Addressables】ダウンロード時のエラーをハンドリングする https://light11.hatenadiary.com/entry/2022/08/02/192445
【Unity】Addressables でリモートカタログのダウンロードの通信に失敗したか確認する例 https://baba-s.hatenablog.com/entry/2022/01/17/150000
【Unity】【Addressable】ストレージ容量不足で書き込みが失敗するエラーをハンドリングする https://light11.hatenadiary.com/entry/2022/08/04/191313
AssetBundleのビルド
AddressableAssetBundleをビルドする前に、リモート利用時のパスを変更します。
Oculusの場合、APK以外の拡張ファイルは
sdcard/Android/obb/[パッケージ名]
に配置されます。
つまり、AddressableAssetBundleの向き先を上記にしてビルドすればAPKから参照ができるようになります。
Profile
Window > Asset Management > Addressable > Profiles
でProfileを開く。
Remote 欄をCustomにし、Remove Local Path を変更します。
sdcard/Android/obb/[パッケージ名]
各種Group
Addressable Asset Group の Build & Local Paths を
BuildPathはそのまま。LoadPathをsdcard/Android/obb/[パッケージ名]
に変更
これでAssetBundleをビルドして、APKも作成します。
AssetBundleビルド後、 ServerData 配下にある catalog_**.json
を見ると パスが正しく設定されていることが確認できます。
また、APKをzipに変換して内部を覗き、 settings.json
を見ると
AddressablesMainContentCatalogRemoteHash
が
sdcard/Android/obb/[パッケージ名]
になっていることが確認できます。
Oculus内部にAssetBundleを置く
まず、OculusにAPKのインストールとアセットバンドルを置くためにSideQuestを利用します。
出来上がったAPKはドラッグアンドドロップするだけでインストールされます
Android > obb > [パッケージ名]
の下に配置します。パッケージ名のフォルダがない場合は作成してください。
ビルドした ServerData 配下のアセットバンドルをドラッグアンドドロップで転送…
これでOculusからAPKを起動するとAssetBundleが正しく読み込まれます。
実際にStoreにアップロードする際は公式を参考してください https://developer.oculus.com/documentation/unity/ps-assets/#unity-support
最後に
以上が Oculus + Unity で5GB以上のアセットデータを扱う方法でした。 Oculus公式のForumはあまり活発でないのか質問の答えが無いものが多く解決に時間がかかりました…
実際にStoreに上げるときに問題が出る可能性はあるため、ローカル環境で成功したからといえ注意が必要です。
Storeに上げて結果が出たら追記します。